function newInstance(Fn, ...args) {


	//通过现代浏览器的操作属性的便利性，可以改变一个对象的 [[Prototype]] 属性, 这种行为在每一个JavaScript引擎和浏览器中都是一个非常慢且影响性能的操作，使用这种方式来改变和继承属性是对性能影响非常严重的，
	// 并且性能消耗的时间也不是简单的花费在 obj.__proto__ = ... 语句上, 它还会影响到所有继承来自该 [[Prototype]] 的对象，如果你关心性能，你就不应该在一个对象中修改它的 [[Prototype]]。
	// 相反, 创建一个新的且可以继承 [[Prototype]] 的对象，推荐使用 Object.create()。
	const obj = Object.create(Fn.prototype);
	const result = Fn.call(obj, ...args);

	// Object.setPrototypeOf(obj,Fn.prototype)
	// __proto__ 特性已经从 Web 标准中删除，虽然一些浏览器目前仍然支持它，但也许会在未来的某个时间停止支持，请尽量不要使用该特性。
	// obj.__proto__ = Fn.prototype;
	return result instanceof Object ? result : obj;
}


function myInstanceOf(obj, Fn) {
	let prototype = Fn.prototype;
	let proto = Object.getPrototypeOf(obj);
	while (proto) {
		if (prototype === proto) {
			return true;
		}
		//如果不等于
		proto = Object.getPrototypeOf(proto)
	}
	return false;
}

function mergeObject(...objs) {
	const result = {};
	objs.forEach(obj => {
		Object.keys(obj).forEach(key => {
			if (result.hasOwnProperty(key)) {
				result[key] = [].concat(result[key], obj[key])
			} else {
				result[key] = obj[key]
			}
		})
	})
	return result;
}

function clone1(target) {
	if (typeof target === 'object' && target !== null) {
		if (Array.isArray(target)) {
			return [...target];
		} else {
			return {...target};
		}
	} else {
		return target;
	}
}

function clone2(target) {
	if (typeof target === 'object' && target !== null) {
		const result = Array.isArray(target) ? [] : {};
		for (let key in target) {
			if (target.hasOwnProperty(key)) {
				result[key] = target[key];
			}
		}
		return result;
	} else {
		return target;
	}
}

function deepclone1(target) {
	let str = JSON.stringify(target);
	return JSON.parse(str);
}

function deepclone2(target, map = new Map()) {
	if (typeof target === 'object' && target !== null) {
		let cache = map.get(target);
		if (cache) return cache;
		const result = Array.isArray(target) ? [] : {};
		map.set(target, result)
		for (let targetKey in target) {
			if (target.hasOwnProperty(targetKey)) {
				result[targetKey] = deepclone2(target[targetKey])
			}
		}
		return result;
	} else {
		return target;
	}
}
